package cn.gyouzhe.source;

import cn.gyouzhe.source.vo.GoodVo;
import cn.gyouzhe.utils.Request;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 来源类
 *
 * @author wangchuan
 * @datetime 2018/2/12 23:13
 */
@Slf4j
abstract class Source implements Runnable {
    private Productor productor;
    private Request request;
    private int preTotalPage = 1;


    private Request getRequest() {
        if(null == request) {
            synchronized(this) {
                if(null == request)
                    request = Request.getInstance();
            }
        }
        return request;
    }

    /**
     * 加载URL
     * @param page 请求页码
     * @return 商品列表
     */
    private int request(int page) {
        try {
            Request.Response res = getRequest().get(buildUrl(page));
            if(res.getCode() == HttpStatus.SC_OK) {
                String content = res.getContent();
                if(StringUtils.isNotEmpty(content)) {
                    List<GoodVo> goodVos = format(content);
                    if(null != goodVos && !goodVos.isEmpty()) {
                        for(GoodVo goodVo : goodVos) {
                            getProductor().publish(goodVo);
                        }
                    }
                    preTotalPage = totalPage(content);
                }
            }
            TimeUnit.SECONDS.sleep(1);
        } catch(Exception e) {
            log.error("请求加载异常", e);
        }
        return preTotalPage;

    }

    /**
     * 获取productor
     * @return
     */
    private Productor getProductor() {
        if(null == productor) {
            synchronized(this) {
                if(null == productor) {
                    productor = Productor.getInstance();
                }
            }
        }
        return productor;
    }

    /**
     * 启动爬取
     */
    public final void start() {
        do {
            int pageNo = 1, totalPage;
            do {
                totalPage = request(pageNo);
                pageNo++;
            } while(pageNo <= totalPage);
        } while(true);
    }

    /**
     * 线程执行方法
     */
    @Override
    public final void run() {
        start();
    }

    /**
     * 构建券请求地址
     * @param goodId 商品ID
     * @param couponId 券ID
     * @return 领券URL
     */
    protected String buildCouponUrl(String goodId, String couponId) {
        return "https://uland.taobao.com/coupon/edetail?itemId=" + goodId + "&activityId=" + couponId;
    }

    /**
     * 构建请求分页URL
     * @param page 分页
     * @return 返回请求字符串
     */
    abstract String buildUrl(int page);

    /**
     * 是否有下一页
     * @param content 返回数据内容
     * @return 总页数
     */
    abstract int totalPage(String content);

    /**
     * 格式化商品信息字符串
     * @param content 请求返回字符串
     * @return 商品VO列表
     */
    abstract List<GoodVo> format(String content);

    /**
     * 格式化JSONObject成GoodVo
     * @param jsonObject  单个商品字符串
     * @return 商品VO
     */
    abstract GoodVo formatItem(JSONObject jsonObject);
}
